package com.chenpeixin;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.sql.*;
import java.util.Scanner;

public class MySQLClientCLI {
    private static Connection connection = null;

    public static void main(String[] args) throws SQLException {
        initConnection();

        Scanner s = new Scanner(System.in);
        System.out.print("> ");
        // 按键盘上的 ctrl + d 结束
        while (s.hasNextLine()) {
            String sql = s.nextLine().trim();
            if (sql.isEmpty()) {
                System.out.print("> ");
                continue;
            }
            executeSql(sql);
            System.out.print("> ");
        }
    }

    private static void initConnection() throws SQLException {
        MysqlDataSource ds = new MysqlDataSource();

        ds.setServerName("localhost");
        ds.setPort(3306);
        ds.setUser("root");
        ds.setPassword("123456");
        ds.setDatabaseName("db_11_24");
        ds.setCharacterEncoding("utf8");
        ds.setServerTimezone("Asia/Shanghai");
        ds.setUseSSL(false);

        connection = ds.getConnection();
    }

    private static void executeSql(String sql) {
        // 需要一个 Connection 对象，希望全局都可以使用，把变量定义成静态变量
        try (PreparedStatement s = connection.prepareStatement(sql)) {
            if (isQuerySql(sql)) {
                try (ResultSet rs = s.executeQuery()) {
                    // meta : 元   metaverise
                    // 形而上 : meta
                    // 关于数据的数据
                    // metaData 关于结果集本身的一些数据
                    ResultSetMetaData metaData = rs.getMetaData();
                    // 一共有多少列
                    int columnCount = metaData.getColumnCount();
                    // metaData.getColumnName(1);  // 拿到第一列的字段名称，从 1 开始
                    // 准备打印一行字段名称
                    StringBuilder sb = new StringBuilder();
                    for (int i = 1; i <= columnCount; i++) {
                        String name = metaData.getColumnName(i);
                        sb.append(name);
                        sb.append(", ");
                    }
                    // 把最后一个字段之后的 ", " 去掉
                    sb.delete(sb.length() - 2, sb.length());
                    System.out.println(sb.toString());

                    while (rs.next()) {
                        // 由于不知道用户输入的 sql 是什么
                        // 所以我们既不知道一共有几个字段，也不知道各个字段的名称
                        StringBuilder sbValue = new StringBuilder();
                        for (int i = 1; i <= columnCount; i++) {
                            // 我们不知道数据类型，我们也只是想显示，所以统一用 String 类型
                            String column = rs.getString(i);
                            sbValue.append(column);
                            sbValue.append(", ");
                        }
                        // 把最后一个字段之后的 ", " 去掉
                        sbValue.delete(sbValue.length() - 2, sbValue.length());
                        System.out.println(sbValue.toString());
                    }
                }
            } else {
                int an = s.executeUpdate();
                System.out.println("影响行数: " + an);
            }
        } catch (SQLException exc) {
            String reason = exc.getMessage();
            System.out.println(reason);
        }
    }

    private static boolean isQuerySql(String sql) {
        String[] s = sql.split(" ");
        String firstWord = s[0].toLowerCase();
        // 暂时认为 show 或者 select 就是查询 sql，其他的暂时都认为是非查询 sql
        return firstWord.equals("show") || firstWord.equals("select");
    }
}
